package com.ntd.study.base.io;

import cn.hutool.core.lang.Console;

import java.nio.ByteBuffer;

/**
 * IO 就是用于传输数据的
 * NIO java1.4 引入
 * BIO：同步阻塞IO，标准的 IO通过字节流和字符流进行操作
 * NIO：同步非阻塞IO（jdk1.4），NIO是基于通道和缓冲区进行操作，数据从通道读取到缓冲区中，或者从缓冲区写入到通道
 * |-- NIO引入了选择器（Selectors）概念，选择器用于监听多个通道的事件，因此NIO可以通过一个线程监听多个数据通道
 * AIO：异步非阻塞IO - NIO 的 2.0 版本
 */
public class DemoIO {

    /**
     * 1.缓冲区：在NIO中负责数据的存取。缓冲区就是数组。用于存储不同数据类型的数据。
     * 根据数据类型不同，提供相应类型的缓冲区（boolean 除外）
     * ByteBuffer，CharBuffer，ShortBuffer，IntBuffer，LongBuffer，FloatBuffer，DobbleBuffer
     * 上述缓冲区的管理方式几乎一致，通过allocate()获取缓冲区
     *
     * @param args
     */
    public static void main(String[] args) {
        // position <= limit <= capactiy
        ByteBuffer buf = ByteBuffer.allocate(1024); // 创建一个指定大小的缓冲区
        Console.log(buf.capacity()); // 1024
        // capacity：容量 - 不可改变
        Console.log(buf.limit()); // 1024
        // limit 界限 - 可操作数据的大小（limit后面的数据我们不可以进行读写）
        Console.log(buf.position()); // 0
        // position： 位置，表示缓冲区正在操作数据的位置
        buf.put("aa".getBytes()); // 缓冲区放入数据
        Console.log(buf.capacity()); // 1024
        Console.log(buf.limit()); // 1024
        Console.log(buf.position()); // 2
        buf.flip(); // 切换到读数据模式
        Console.log(buf.capacity()); // 1024
        Console.log(buf.limit()); // 2
        Console.log(buf.position()); // 0
        byte b = buf.get();// 缓冲区取出数据 - 一次一个
        Console.log(b); // 97
        Console.log(buf.position()); // 1
        buf.rewind(); // 重置读数据模式
        Console.log(buf.position()); // 0

    }
}
